package main

import (
	"fmt"
	"time"
)

/*
  在某些场景下我们需要同时从多个通道接受数据，这个时候可以使用golang提供的select多路复用

 select的使用类似于switch语句，它有一系列的case分支和一个默认分支。每个case会对应一个管道
 的通信（接受或发送）过程。select会一直等待，直到某个case的通信操作完成时，就会执行case分支
 对应的语句，其具体格式如下：

   select {
	 case <- ch1:
		  ...
	 case data := <-ch2:
      ...
	 case ch3<- data:
		  ...

	 }
*/

func main() {

	//定义int 类型管道
	intChan := make(chan int, 10)
	for i := 0; i < 10; i++ {
		intChan <- i
	}
	//定义string 类型管道
	stringChan := make(chan string, 5)
	for i := 0; i < 5; i++ {
		stringChan <- "hello" + fmt.Sprintf("%d", i)
	}

	//使用多路复用不需要关闭管道
	for {
		select {
		case v := <-intChan:
			fmt.Printf("从intChan取出的数据%d\n", v)
			time.Sleep(time.Millisecond * 50)
		case v := <-stringChan:
			fmt.Printf("从stringChan取出的数据%s\n", v)
			time.Sleep(time.Millisecond * 50)
		default:
			fmt.Println("都取完了")
			return
		}

	}

}
